package com.jeomo.common.quartz.starter;

/**
 * 解析cron解析式
 *
 * @author 崔贺
 * @created 2020/8/10
 */
public class CronAnalysis {
    /**
     * 解析cron解析式
     *
     * @param cronExp
     * @author 崔贺
     * @created 2020/8/10
     */
    public static String descCorn(String cronExp) {
        String[] tmpCorns = cronExp.split(" ");
        StringBuffer sBuffer = new StringBuffer();
        if (tmpCorns.length != 6) {
            throw new RuntimeException("请补全表达式,必须标准的cron表达式才能解析");
        }

        descMonth(tmpCorns[4], sBuffer);

        descWeek(tmpCorns[5], sBuffer);

        descDay(tmpCorns[3], sBuffer);

        descHour(tmpCorns[2], sBuffer);

        descMintue(tmpCorns[1], sBuffer);

        descSecond(tmpCorns[0], sBuffer);
        sBuffer.append(" 执行");
        return sBuffer.toString();

    }

    /**
     * 解析秒
     *
     * @param s
     * @param sBuffer
     * @author 崔贺
     * @created 2020/8/10
     */
    private static void descSecond(String s, StringBuffer sBuffer) {
        String unit = "秒";
        desc(s, sBuffer, unit);
    }

    /**
     * 解析分钟
     *
     * @param s
     * @param sBuffer
     * @author 崔贺
     * @created 2020/8/10
     */
    private static void descMintue(String s, StringBuffer sBuffer) {
        desc(s, sBuffer, "分钟");
    }

    /**
     * 解析小时
     *
     * @param s
     * @param sBuffer
     * @author 崔贺
     * @created 2020/8/10
     */
    private static void descHour(String s, StringBuffer sBuffer) {
        desc(s, sBuffer, "小时");
    }

    /**
     * 解析日
     *
     * @param s
     * @param sBuffer
     * @author 崔贺
     * @created 2020/8/10
     */
    private static void descDay(String s, StringBuffer sBuffer) {
        desc(s, sBuffer, "天");
    }

    /**
     * 解析周
     *
     * @param s
     * @param sBuffer
     * @author 崔贺
     * @created 2020/8/10
     */
    private static void descWeek(String s, StringBuffer sBuffer) {
        //涉及到日期和星期的比较，暂不实现。
    }

    /**
     * 解析月
     *
     * @param s
     * @param sBuffer
     * @author 崔贺
     * @created 2020/8/10
     */
    private static void descMonth(String s, StringBuffer sBuffer) {
        desc(s, sBuffer, "月");
    }

    /**
     * @param s
     * @param sBuffer
     * @param unit
     * @author 崔贺
     * @created 2020/8/10
     */
    private static void desc(String s, StringBuffer sBuffer, String unit) {
        if (s.equals("1/1")) {
            s = "*";
        }
        if (s.equals("0/0")) {
            s = "0";
        }
        if ("*".equals(s)) {
            sBuffer.append("每" + unit);
            return;
        }
        if ("?".equals(s)) {
            return;
        }
        if (s.contains(",")) {
            String[] arr = s.split(",");
            for (int i = 0; i < arr.length; i++) {
                if (arr[i].length() != 0) {
                    sBuffer.append("第" + arr[i] + unit + "和");
                }
            }
            sBuffer.deleteCharAt(sBuffer.length() - 1);
            sBuffer.append("的");
            return;
        }
        if (s.contains("-")) {
            String[] arr = s.split("-");
            if (arr.length != 2) {
                throw new RuntimeException("表达式错误" + s);
            }
            sBuffer.append("从第" + arr[0] + unit + "到第" + arr[1] + unit + "每" + unit);
            sBuffer.append("的");
            return;
        }

        if (s.contains("/")) {
            String[] arr = s.split("/");
            if (arr.length != 2) {
                throw new RuntimeException("表达式错误" + s);
            }
            if (arr[0].equals(arr[1]) || arr[0].equals("0")) {
                sBuffer.append("每" + arr[1] + unit);
            } else {
                sBuffer.append("每" + arr[1] + unit + "的第" + arr[0] + unit);
            }
            return;
        }
        sBuffer.append("第" + s + unit);
    }

    //测试方法
    //顺序为：秒 分 时 日期 月份 星期
    //0 0-5 14 * * ? 表示每月每天第14小时从第0分钟到第5分钟每分钟的第0秒 执行
    public static void main(String[] args) {
        String CRON_EXPRESSION = "0 34 15 * * ?";

        System.out.println(descCorn(CRON_EXPRESSION));
    }
}

